//
// Created by kevin on 2024/11/28.
//


#include "utils.h"


// 写入二进制文件的函数
void writeBinaryFile(const char* fileName, const void* data, size_t dataSize) {
    // 创建输出文件流对象，并以二进制写模式打开文件
    std::ofstream outFile(fileName, std::ios::out | std::ios::binary);
    if (outFile.is_open()) {
        // 将传入的数据写入文件
        outFile.write(static_cast<const char*>(data), dataSize);
        // 关闭文件
        outFile.close();
    } else {
        std::cerr << "无法打开文件 " << fileName << " 进行写入操作" << std::endl;
    }
}

// 读取二进制文件的函数
size_t readBinaryFile(const char* fileName, void* buffer, size_t bufferSize) {
    std::ifstream inFile(fileName, std::ios::in | std::ios::binary);
    if (inFile.is_open()) {
        // 获取文件大小（通过移动文件指针到末尾，获取位置，再移回开头）
        inFile.seekg(0, std::ios::end);
        size_t fileSize = inFile.tellg();
        inFile.seekg(0, std::ios::beg);

        // 如果传入的缓冲区大小小于文件实际大小，调整读取的字节数为缓冲区大小
        size_t bytesToRead = std::min(fileSize, bufferSize);

        // 从文件中读取数据到缓冲区
        inFile.read(static_cast<char*>(buffer), bytesToRead);

        // 关闭文件
        inFile.close();

        return bytesToRead;
    } else {
        std::cerr << "无法打开文件 " << fileName << " 进行读取操作" << std::endl;
        return 0;
    }
}

void repmat(int *src, int m, int n, int *dst, int dm, int dn) {
    for (int i = 0; i < dm; ++i) {
        for (int j = 0; j < dn; ++j) {
            int src_i = i % m;
            int src_j = j % n;
            dst[i * dn + j] = src[src_i * n + src_j];
        }
    }
}

int getbitnums(int in){
    int temp = in < 0? -in : in;
    int count = 0;
    if (temp == 0) {
        count = 1;
    } else {
        while (temp) {
            count++;
            temp = temp >> 1;
        }
    }
    return count;
}
